perm filename NEWMRK.F4[1,LCS]1 blob
sn#668544 filedate 1982-07-10 generic text, type T, neo UTF8
00100 C**** NEWMRK.F4 *****
00200 COPYRIGHT 1982 BY LELAND SMITH
00300 C************ READX, NEWMRK, ISNUM, DOIT, MORMRK, DASHES, CPYALL, CMDIN *******
00400
00500 SUBROUTINE READX
00600 COMMON R2,JA,CENTR,J2,RJQ(20),JQ(20) /ALF/INP(72)/SCM/V(78)
00700 EQUIVALENCE (V(2),V2)
00800 C****320 REREAD 2430,J,R2,RJQ
00900 C ↑↑↑ 1/78
01000 DO 2 K=2,72
01100 IF(INP(K).NE.'<')GO TO 2
01200 DO 3 J=K,72
01300 3 INP(J)=' '
01400 GO TO 4
01500 2 CONTINUE
01600 C CATCH '<' -- WHICH = COMMENT FOR REST OF LINE
01700 4 CALL RREAD(INP,V)
01800 JA=V(1)
01900 R2=V2
02000 DO 1 K=1,20
02100 1 RJQ(K)=V(K+2)
02200 END
02300
02400 FUNCTION ISNUM(M)
02500 C ISNUM=0 IF M=A NUMBER. ASSUMES A DOT MEANS DECIMAL POINT
02600 ISNUM=-1
02700 IF(M.EQ.'.')ISNUM=0
02800 IF(M.GE.'0'.AND.M.LE.'9')ISNUM=0
02900 END
03000
03100 SUBROUTINE NEWMRK(VX)
03200 DIMENSION VX(1)
03300 COMMON /DPY/ST(3690),N(1),N2,N3,JN(72),KN(172),RX(50),JJ,NN,MM
03400 1 /SC/A,B,C,D,E,NNN /ALF/INP(1) /MX/MX,MZ
03405 DO 40 J=1,72
03410 M=INP(J)
03412 C CHANGES /C 7 12/ TO /C 7:12/ ETC.
03415 IF(M.EQ.'*')GO TO 41
03420 IF(M.NE.'C'.AND.M.NE.'O')GO TO 40
03421 IF(INP(J+1).EQ.'R')GO TO 40
03422 NN=-1
03423 N2=J+1
03425 44 DO 42 MM=N2,72
03426 JJ=INP(MM)
03427 IF(JJ.EQ.'/')GO TO 40
03428 IF(JJ.EQ.'*'.OR.JJ.EQ.';')GO TO 41
03430 IF(ISNUM(JJ).NE.0)GO TO 42
03432 C NOW FOUND A NUMBER. NEXT LOOK FOR SPACE.
03435 DO 43 MX=MM+1,72
03440 IF(INP(MX).NE.' '.AND.INP(MX).NE.':')GO TO 43
03445 IF(NN.LT.0)INP(MX)=':'
03447 C INSERT : AFTER EVERY OTHER NUMBER.
03450 NN=-NN
03455 N2=MX+1
03460 GO TO 44
03465 43 CONTINUE
03470 42 CONTINUE
03475 40 CONTINUE
03500 41 J=1
03600 34 J=J+1
03700 35 IF(ISNUM(INP(J)).NE.0)GO TO 30
03800 DO 31 MM=J+1,72
03900 M=INP(MM)
04000 IF(M.EQ.'/')GO TO 30
04100 IF(M.EQ.';')GO TO 30
04200 IF(M.EQ.'*')GO TO 30
04300 IF(M.NE.' ')GO TO 31
04400 C NOW FOUND SPACE AFTER NUMB.
04500 DO 32 J=MM+1,72
04600 M=INP(J)
04700 IF(M.EQ.' ')GO TO 32
04800 IF(ISNUM(M).NE.0)GO TO 30
04900 C FOUND SOMETHING, BUT NOT NUMB.
05000 INP(MM)=','
05100 C FOUND NUMB, SO PUT IN COMMA
05200
05300 IF(J.LT.72)GO TO 35
05400 GO TO 33
05500 32 CONTINUE
05600 GO TO 33
05700 31 CONTINUE
05800 GO TO 33
05975 30 IF(J.LT.72)GO TO 34
06000 33 MX=0
06100 C MX IS FLAG FOR LINE TOO LONG IN NEW FORMAT
06200 J=0
06300 MM=0
06400 10 JJ=0
06500 NN=0
06600 N2=0
06700 1 J=J+1
06800 IF(J.GT.72)GO TO 20
06900 C JUMP IF DONE
07000 M=INP(J)
07100 CURRENT CHARACTER
07200 IF(M.EQ.'-')GO TO 21
07300 C '-' NEEDED FOR "C-" (DECRESC. SIGN)
07400 IF(M.LT.'A'.OR.M.GT.'Z')GO TO 2
07500 C JUMP IF A LETTER IS NOT FOUND
07600 21 JJ=JJ+1
07700 N(JJ)=M
07800 GO TO 1
07900 2 IF(M.EQ.' ')GO TO 1
08000 5 NN=NN+1
08100 JN(NN)=M
08200 C SAVE THE NUMBER CHARS.
08300 6 J=J+1
08400 M=INP(J)
08500 CC IF(M.GE.'0'.AND.M.LE.'9')GO TO 5
08600 CC IF(M.EQ.'.')GO TO 5
08700 IF(ISNUM(M).EQ.0)GO TO 5
08800 CXX IF(M.NE.':')GO TO 22
08900 IF(M.NE.'!')GO TO 22
09000 M='-'
09100 C NEG. N2 WILL =TOTAL OF ITEMS STARTING WITH N1( /S 12!3/=/S 12:14/)
09200 NN=NN+1
09300 JN(NN)=' '
09400 GO TO 5
09500 22 IF(M.EQ.' ')GO TO 6
09600 IF(M.NE.':')GO TO 7
09700 C NOW A SEQUENCE OF ITEMS
09800 M=' '
09900 GO TO 5
10000 7 IF(M.NE.',')GO TO 8
10100 C NOW A SINGLE ITEM
10200 CALL DOIT
10300 NN=0
10400 C ITEM OR ITEMS NOW FINISHED
10500 GO TO 6
10600 8 IF(M.NE.'/')GO TO 11
10700 CALL DOIT
10800 GO TO 10
10900 11 IF(M.NE.';'.AND.M.NE.'*')GO TO 6
11000 C JUMP IF UNKNOWN CHAR.
11100 CALL DOIT
11200 KN(MM)=M
11300 IF(MM.LE.71)GO TO 20
11400 C SKIP IF REVISED LINE NOT TOO LONG
11500 MZ=MM
11600 DO 201 MM=71,1,-1
11700 201 IF(KN(MM).EQ.'/')GO TO 202
11800 202 MX=MM+1
11900 C POINTS TO START OF REMAINDER OF TOO-LONG LINE
12000 INP(72)=0
12100 20 CALL MORMRK(1,MM,VX)
12200 END
12300
12400 SUBROUTINE DOIT
12500 COMMON /DPY/ST(3690),N(1),N2,N3,JN(72),KN(172),RX(50),JJ,NN,MM
12600 IF(N(1).NE.'C'.AND.N(1).NE.'O')GO TO 3
12700 CATCHES /C 5-7/C- 11.2-13.5/O 1-21/ ETC.
12800 IF(N2.EQ.'R')GO TO 3
12900 C JUMP IF "CR" FOR WORD "CRESC."
13000 DO 4 K=1,NN
13100 MM=MM+1
13200 JX=JN(K)
13300 KN(MM)=JX
13400 4 IF(JX.EQ.' ')GO TO 5
13500 C FIRST NUMBER COMPLETED
13600 5 DO 6 JX=1,JJ
13700 MM=MM+1
13800 6 KN(MM)=N(JX)
13900 CODE LETTER INSERTED
14000 MM=MM+1
14100 KN(MM)=' '
14200 DO 7 JX=K+1,NN
14300 C NOW PUT IN LAST NUMBER
14400 MM=MM+1
14500 7 KN(MM)=JN(JX)
14600 GO TO 8
14700 3 DO 1 K=1,NN
14800 MM=MM+1
14900 1 KN(MM)=JN(K)
15000 MM=MM+1
15100 KN(MM)=' '
15200 DO 2 K=1,JJ
15300 MM=MM+1
15400 2 KN(MM)=N(K)
15500 C NOW PUT IN THE CODE WORD
15600 8 MM=MM+1
15700 KN(MM)='/'
15800 CLOSE OFF THE ITEM
15900 END
16000
16100 CC SUBROUTINE MORMRK(VX)
16200 SUBROUTINE MORMRK(MA,MB,VX)
16300 DIMENSION VX(1)
16400 COMMON /DPY/ST(3690),N(1),N2,N3,JN(72),KN(172),RX(50),JO,NN,MM
16500 1 /SC/A,B,C,D,E,NNN /ALF/INP(1) /MX/MX,MZ
16600 CC K=0
16700 MM=0
16800 C GET THE REST OF A TOO-LONG LINE
16900 DO 1 K=MA,MB
17000 CC DO 1 J=MX,MZ
17100 MM=MM+1
17200 CC K=K+1
17300 1 INP(MM)=KN(K)
17400 CC1 INP(K)=KN(J)
17500 CC MM=K
17600 DO 13 K=MM+1,72
17700 13 INP(K)=' '
17800 IF(INP(MM).EQ.'*')INP(72)='*'
17900 C LINE ENDS WITH * OR ;
18000 C NOW GO FIX UP THE VX ARRAY.
18100 3 CALL RREAD(INP,VX)
18200 DO 23 K=1,50
18300 X=VX(K)
18400 IF(X.GT.0)Z=X
18500 C SAVE THE LAST POSITIVE NUM.
18600 IF(X.LT.0)VX(K)=-X+Z-1.
18700 C /S 17:5/=/S 17-21/ I.E. 5 NOTES STACCATO, STARTING WITH 17
18800 23 CONTINUE
18900 999 NNN=VX(1)
19000 CC MX=0
19100 END
19200
19300 SUBROUTINE DASHES(IX,R2,RD)
19400 CC SUBROUTINE DASHES(IX,R2,R3,R4,R5,R6)
19500 DIMENSION RD(1)
19600 C R3=RD(1) R4=RD(2) . . . R7=RD(5) R8=RD(6) . . .
19700 COMMON /XRN/RN(3000)/PTR/KWDS(350)/DL/K22 /STF/RSTFAC(0/7),RSTJ2
19800 DATA RDX/2.3/,RDZ/0.5/,BSIZE/3.17/
19900 C FIND CLOSEST WORD TO LFT AND RIGHT OF R3 BSIZE=BASIC SIZE OF 1 LETTER
20000 IF(RD(8).EQ.0)RETURN
20100 C P10 MUST NOT!! BE ZERO.
20200 B=9999.0
20300 A=-B
20400 LFT=0
20500 JRT=0
20600 DO 1 K=1,IX
20700 C GETS CODE NUM. J=PTR TO THAT ITEM.
20800 J=KWDS(K)
20900 5 IF(RN(J+1).NE.16)GO TO 1
21000 C FOUND WORD
21100 IF(RN(J+2).NE.R2)GO TO 1
21200 C NOW ON THIS STAFF
21300 IF(ABS(RN(J+4)-RD(2)).GT.4.)GO TO 1
21400 C P4 OF DASH MUST BE WITHIN +4, -4 VERTICAL STEPS OF WORD ON EITHER SIDE.
21500 7 RR3=RN(J+3)
21600 IF(RR3.GT.RD(1))GO TO 3
21700 IF(RR3.LE.A)GO TO 1
21800 A=RR3
21900 LFT=J
22000 C A WILL BE POS. OF FRONT OF LEFT GROUP. LFT IS PNTR.
22100 GO TO 1
22200 3 IF(RR3.GE.B)GO TO 1
22300 B=RR3
22400 JRT=J
22500 1 CONTINUE
22600 C WON'T WORK WITH OVERLAPPING WORDS!!!!
22700
22800 J=LFT
22900 IF(LFT.NE.0)GO TO 2
23000 IF(JRT.EQ.0)RETURN
23100 J=JRT
23200 2 SZ=RN(J+5)
23300 R5=SZ*RSTJ2
23400 C R=REAL SIZE FACTOR FOR SPACE RN(LFT+9) IS WIDTH OF GROUP TO LEFT.
23500 RP=R5*RN(J+9)+A
23600 IF(RP.LT.0)RP=3.0
23700 C RP=RIGHT SIDE OF LEFT CHAR. STRING.
23800 R3=RP
23900 IF(B.GT.201)B=201.
24000 R6=B-R5*BSIZE
24100 CC RR6=R6
24200 IF(R3.LT.0)R3=4.
24300 CX IF(R6.GT.201)R6=201.
24400 C 3.17 IS BASIC WIDTH OF MOST LETTERS
24500 IF(RD(5).EQ.0)GO TO 4
24600 C SKIP IF R7=0 (NO SHORT DASHES)
24700 A=B-RP-BSIZE*R5
24800 C DIST. FROM END OF LFT WD TO START OF RT WD. (LESS 2 CHAR SPACES)
24900 8 B=IFIX(A/(25.*R5))+1.
25000 C B=NUMB OF DASHES
25100 9 RR3=2.5*SZ
25200 C RR3 IS DASH WIDTH
25300 A=(A-B*2.5*R5)/(B+1.)
25400 C A=SPACE BETWEEN DASHES (P9) IF SPACE IS TOO SMALL MAKE LRG DASH.
25500 CCC IF(A.LT.RDZ)GO TO 11
25600 R3=RP+A
25700 10 R6=R6-RDZ
25800 CC10 R6=R3+(RR3+A)*B-RR3-RDZ
25900 RD(6)=RR3
26000 RD(7)=A/RSTJ2
26100 C P9(SPACE BETWEEN DASHES) REAL SIZE IS P9*RSTJ2
26200 CCC GO TO 4
26300 CCC11 RD(5)=0
26400 4 RD(2)=RN(J+4)+1.0-R5*0.5
26500 C SET HEIGHT OF DASH CONSIDERS LETTER SIZE AND STAFF SIZE
26600 RD(3)=RD(2)
26700 C WAS R5=R4
26800 RD(1)=R3
26900 IF(R6-R3.LT.0.2)R6=R3+0.2
27000 RD(4)=R6
27100 END
27200
27300 SUBROUTINE CPYALL
27400 C COPIES ALL OF ONE CODE NUM. FROM ONE STAFF TO ALL OTHER ACTIVE STAVES.
27500 COMMON /LIMIT/LIMIT,ITEM,L,I /PTR/KWDS(1) /POSI/S(8),JJ2
27600 COMMON R2,J,K,N,RJQ(3),R6,RJ(16),NO,JQ(10),NN,LL /XRN/RN(1)
27700 JJ2=ITEM+1
27800 J=ITEM
27900 C NOW FIND WHICH STAVES CURRENTLY ACTIVE
28000 DO 1 K=0,7
28100 1 JQ(K)=0
28200 DO 2 K=1,J
28300 L=KWDS(K)
28400 2 JQ(IFIX(RN(L+2)))=-1
28500 JQ(IFIX(R2))=0
28600 C BUT OMIT SOURCE STAFF
28700 DO 3 K=1,J
28800 L=KWDS(K)
28900 IF(RTLINE(L).LT.0)GO TO 3
29000 C ON RIGHT LINE?
29100 IF(OUTLIM(L,3).LT.0)GO TO 3
29200 C WITHIN GIVEN LFT AND RT LIMITS?
29300 9 IF(RN(L+1).NE.R6)GO TO 3
29400 C FOUND A SOURCE ITEM (CODE# IN R11). NOW PUT IT ON ALL OTHER STAVES.
29500 7 NN=RN(L)+3
29600 C NUMBER OF NEW WORDS ADDED TO ARRAY
29700 DO 8 N=0,7
29800 IF(JQ(N).EQ.0)GO TO 8
29900 4 CALL LOOP(0,NN,1,I,L,RN)
30000 5 ITEM=ITEM+1
30100 LL=KWDS(ITEM)
30200 RN(LL+2)=N
30300 C PUT IN CORRECT STAFF NUM.
30400 6 I=I+NN
30500 C UPDATE XRN ARRAY COUNTER AND POINTER ARRAY.
30600 KWDS(ITEM+1)=I
30700 8 CONTINUE
30800 3 CONTINUE
30900 CC JJ2=ITEM+1
31000 END
31100
31200 SUBROUTINE CMDIN
31300 C SAVES INPUT LINES WHEN 1ST CHAR. IS : EACH STRING=23 CHARS.
31400 C OUTPUTS SAVED LINES WHEN 1ST CHAR. IS ;
31500 COMMON /ALF/INP(72)
31600 DIMENSION J(72)
31700 EQUIVALENCE (I1,INP),(I2,INP(2)),(I3,INP(3))
31800 IF(I1.EQ.';')GO TO 11
31900 C JUMP TO GET BACK COMMAND 1, 2 OR 3 (; ;; ;;;)
32000 N=2
32100 L=1
32200 LL=1
32300 10 NN=N+22
32400 DO 2 K=N,NN
32500 M=INP(K)
32600 IF(M.EQ.':')GO TO 3
32700 J(L)=M
32800 2 L=L+1
32900 IF(K.EQ.NN)GO TO 6
33000 3 DO 5 KK=K,NN
33100 J(L)=' '
33200 5 L=L+1
33300 4 IF(M.NE.':')GO TO 6
33400 C 3 COMMANDS CAN BE GIVEN ON ONE LINE, EACH STARTS WITH :
33500 C THE 1ST ONE WILL BE ACTIVATED IMMEDIATELY, OR BY TYPING ;
33600 C THE 2ND AND 3RD ARE ACTIVATED BY TYPING ;; OR ;;;
33700 C NO ERROR TRAP FOR MORE THEN 3 COLONS
33800 LL=LL+23
33900 L=LL
34000 N=K+1
34100 GO TO 10
34200 6 N=1
34300 9 NN=N+19
34400 L=0
34500 DO 7 K=N,NN
34600 L=L+1
34700 7 INP(L)=J(K)
34800 DO 8 K=24,72
34900 C CLEAR REST OF INP ARRAY
35000 8 INP(K)=' '
35100 RETURN
35200 11 N=1
35300 IF(I2.EQ.';')N=24
35400 IF(I3.EQ.';')N=47
35500 GO TO 9
35600 C GO GET BACK COMMAND 1, 2 OR 3 (; ;; ;;;)
35700 END